package com.hejia.alauda.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;

import com.hejia.alauda.entity.Financing;
import com.hejia.alauda.entity.Order;
import com.hejia.alauda.entity.Order.Status;
import com.hejia.alauda.entity.example.OrderExample;
import com.hejia.alauda.exception.BusinessException;
import com.hejia.alauda.jms.AlaudaSender;
import com.hejia.alauda.utils.Pager;

/**
 * 订单服务
 * 
 * @author hyr
 *
 */
public interface OrderService {

	/**
	 * 查找订单
	 * 
	 * @param example
	 *            查询条件
	 * @param pager
	 *            分页
	 * @return 订单列表
	 */
	Pager<Order> findOrders(OrderExample example, Pager<Order> pager);

	/**
	 * 根据订单ID查找
	 * 
	 * @param id
	 * @return 订单
	 */
	Order findOrderById(long id);

	/**
	 * 查找订单
	 * 
	 * @param keyword
	 *            关键词
	 * @param startDate
	 *            订单时间开始
	 * @param endDate
	 *            订单时间结束
	 * @param pager
	 *            分页
	 * @return 订单列表
	 */
	Pager<Order> findOrders(String keyword, Date startDate, Date endDate,
			Pager<Order> pager);

	/**
	 * 查找订单
	 * 
	 * @param keyword
	 *            关键词
	 * @param status
	 *            订单状态
	 * @param startDate
	 *            订单时间开始
	 * @param endDate
	 *            订单时间结束
	 * @param pager
	 *            分页
	 * @return 订单列表
	 */
	Pager<Order> findOrders(String keyword, Status status, String finastatus,
			Date startDate, Date endDate, Pager<Order> pager);

	/**
	 * 根据订单状态和日期查找订单
	 * @param orderNumber 
	 *
	 * @param orderNumber
	 * @param status
	 * @param CreateDate
	 * @param pager
	 * @return
	 */
	Pager<Order> findOrderByStatusAndDate(String orderNumber, Order.Status status,
			String CreateDate, Pager<Order> pager);
	
	Pager<Order> findOrderByStatusAndDate(Order.Status status,
			String CreateDate, Pager<Order> pager);

	/**
	 * 根据订单状态个日期计算销量总额和订单数
	 *
	 * @param status
	 *            状态
	 * @param createDate
	 *            (yyyy-MM-dd)
	 * @return
	 */
	Map<String, Object> findSumSalesAndOrders(Order.Status status,
			String createDate);

	/**
	 * 插入一条新的订单
	 * 
	 * @param order
	 * @return
	 */
	boolean insertOrder(Order order, Executor executor, AlaudaSender sender);

	/**
	 * 处理过期未付款的账单
	 * 
	 * @param id
	 * @return
	 */
	boolean dealOverdueOrder(Long id);

	/**
	 * 处理移动端取消订单后释放订单
	 * 
	 * @param id
	 * @return
	 */
	Order dealCancelOrder(String no_order);

	/**
	 * 根据条件查询一条订单信息
	 * 
	 * @param example
	 * @return
	 */
	Order findOneOrder(OrderExample example);

	/**
	 * 根据支付订单id找到对应的订单
	 * 
	 * @param payNumber
	 *            支付订单id
	 * @return
	 */
	Order findOrderByPayNumber(String payNumber);

	/**
	 * 根据条件来查询用户订单
	 * 
	 * @param example
	 * @return
	 */
	List<Order> findOrdersByExample(OrderExample example, Pager<Order> pager);

	/**
	 * 根据条件来查询用户订单--行数
	 * 
	 * @param example
	 * @return
	 */
	Integer findOrderCountByExample(OrderExample example);

	/**
	 * 更新订单记录
	 * 
	 * @param order
	 * @return
	 */
	boolean updateOrder(Order order);

	int updateOrderStatusImmediately(String orderNumber, String changeStatus,
			String whereStatus);

	/**
	 * 更新订单的标签
	 * 
	 * @param order
	 * @return
	 */
	int updateOrderTag(Order order);

	/**
	 * 更新订单支付网关代码
	 * 
	 * @param id
	 *            订单ID
	 * @param payGateCode
	 *            支付网关代码
	 * @return
	 * @throws BusinessException
	 */
	Order updateOrderPayGateCode(Long id, String payGateCode)
			throws BusinessException;

	/**
	 * 获取订单的到期日
	 * 
	 * @param id
	 * @return
	 */
	Date getOrderSettlementDate(Long id);

	/**
	 * 查询超额支付订单
	 * 
	 * @param pager
	 * @param keyword
	 *            关键词
	 * @param date
	 *            下单日期
	 * @param refund
	 *            是否退款
	 * @return 超额支付订单
	 */
	Pager<Order> findExcessOrders(Pager<Order> pager, String keyword,
			Date date, Boolean refund);

	/**
	 * 查询未同步支付最终状态订单ID列表
	 * 
	 * @param startTime
	 *            查询订单开始时间
	 * @return 未同步支付最终状态订单ID列表
	 */
	List<Long> findNotSyncPayStatusOrderIds(Date startTime);

	/**
	 * 查询未还款的用户订单
	 * 
	 * @param userId
	 *            用户ID
	 * @param date
	 *            日期
	 * @return
	 */
	List<Order> findPaidOrdersByUserIdAndDate(Long userId, Date date);

	/**
	 * 保存订单的track
	 * 
	 * @param order
	 * @param track_id
	 */
	void saveOrderTrack(Order order, String track_id);

	/**
	 * 退款
	 * 
	 * @param orderId
	 *            订单ID
	 */
	Order refund(Long orderId);

	/**
	 * 根据订单id获取financing
	 * 
	 * @param id
	 * @return
	 */
	Financing findFinancingByOrderId(Long id);

	/**
	 * 根据订单id查询红包
	 * 
	 * @param id
	 * @return
	 */
	BigDecimal findBonusByOrderId(Long id);
	
	Pager<Order> findPaidOrdersByProduct(Long id, Pager<Order> pager);
}
